/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.documentar.DAO;

import br.com.documentar.interfacee.InterfaceDAO;
import br.com.documentar.model.EstruturaModel;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 *
 * @author Santos
 */
public class EstruturaDAO extends AbstractDAO implements InterfaceDAO<List<EstruturaModel>, EstruturaModel> {

    @Override
    public boolean setDados(EstruturaModel model) {

        String sql = null;
        ConnectDataBase();

        switch (model.getActionScript()) {
            case "I":
                sql = "INSERT INTO \n"
                        + "  `test_estrutura_computacional`\n"
                        + "(\n"
                        //+ "  `TEST_CODIGO_PK`,\n"
                        + "  `TEST_PRODUTO_FKN`,\n"
                        + "  `TEST_CLIENTE_FK`,\n"
                        + "  `TEST_NOME_COMPUTADOR`,\n"
                        + "  `TEST_TIPO`,\n"
                        + "  `TEST_IP`,\n"
                        + "  `TEST_TIPO_ACESSO_REMOTO`,\n"
                        + "  `TEST_USUARIO_ACESSO_REMOTO`,\n"
                        + "  `TEST_SENHA_ACESSO_REMOTO`,\n"
                        + "  `TEST_TIPO_BANCO_DADOS`,\n"
                        + "  `TEST_NOME_BANCO_DADOS`,\n"
                        + "  `TEST_PORTA_BANCO_DADOS`, \n"
                        + "  `TEST_VERSAO_BANCO`, \n"
                        + "  `TEST_ATIVO`) \n"
                        + "VALUE (\n"
                        //+ "  :TEST_CODIGO_PK,\n"
                        + "  " + model.getProdutoModel().getCodigo() + ",\n"
                        + "  " + model.getClienteModel().getCodigo() + ",\n"
                        + "  '" + model.getNomeComputador() + "',\n"
                        + "  '" + model.getTipoComputador() + "',\n"
                        + "  '" + model.getHostIP() + "',\n"
                        + "  '" + model.getTipoAcessoRemoto() + "',\n"
                        + "  '" + model.getUsuarioAcessoRemoto() + "',\n"
                        + "  '" + model.getSenhaAcessoRemoto() + "',\n"
                        + "  '" + model.getTipoBancoDados() + "',\n"
                        + "  '" + model.getNomeBancoDados() + "',\n"
                        + "  '" + model.getPortaBancoDados() + "',\n"
                        + "  '" + model.getVersaoBanco() + "',\n"
                        + "  '" + model.getAtivo() + "')";
                break;
            case "U":
                sql = "";
                break;
            case "D":
                sql = "";
                break;
        }
        return InsertUpdateDelete(sql, model.getNomeTela());
    }

    @Override
    public List<EstruturaModel> getDados(EstruturaModel model) {
        model.setResultSet(null);
        model.getLista().clear();
        String sql = "SELECT \n"
                + "      `estrutura`.`TEST_CODIGO_PK`,\n"
                + "      `estrutura`.`TEST_PRODUTO_FKN`,\n"
                + "      `produto`.`TPRO_NOME`,\n"
                + "      `produto`.`TPRO_SIGLA`,\n"
                + "      `estrutura`.`TEST_CLIENTE_FK`,\n"
                + "       `cliente`.`TCLI_NOME_RAZAO_SOCIAL`,\n"
                + "      `estrutura`.`TEST_NOME_COMPUTADOR`,\n"
                + "      `estrutura`.`TEST_TIPO`,\n"
                + "      `estrutura`.`TEST_IP`,\n"
                + "      `estrutura`.`TEST_TIPO_ACESSO_REMOTO`,\n"
                + "      `estrutura`.`TEST_USUARIO_ACESSO_REMOTO`,\n"
                + "      `estrutura`.`TEST_SENHA_ACESSO_REMOTO`,\n"
                + "      `estrutura`.`TEST_TIPO_BANCO_DADOS`,\n"
                + "      `estrutura`.`TEST_NOME_BANCO_DADOS`,\n"
                + "      `estrutura`.`TEST_PORTA_BANCO_DADOS`\n"
                + "FROM \n"
                + "      `test_estrutura_computacional` `estrutura`\n"
                + "    inner join `tcli_cliente` `cliente`\n"
                + "    on `estrutura`.`TEST_CLIENTE_FK` = `cliente`.`TCLI_CODIGO_PK`\n"
                + "    left join `tpro_produto` `produto`\n"
                + "    on `estrutura`.`TEST_PRODUTO_FKN` =  `produto`.`TPRO_CODIGO_PK`  ";
        try {
            ConnectDataBase();
            switch (model.getActionScript()) {
                case "C":
                    model.setResultSet(Select(sql, model.getNomeTela()));
                    break;
                case "P":
                    model.setResultSet(Select(sql + " WHERE TPRO_NOME LIKE '%" + model.getNomeBancoDados() + "%' ", model.getNomeTela()));
                    break;
                case "porClienteProdutoComputadorServidor":
                    model.setResultSet(Select(sql + " where `estrutura`.`TEST_CLIENTE_FK` = " + model.getClienteModel().getCodigo() + " \n"
                            + " and `estrutura`.`TEST_PRODUTO_FKN` = " + model.getProdutoModel().getCodigo() + "\n"
                            + " and `estrutura`.`TEST_TIPO` =  'A'\n"
                            + " and `estrutura`.`TEST_NOME_COMPUTADOR` = '" + model.getNomeComputador() + "'", model.getNomeTela()));
                    break;
                case "porCliente":
                    model.setResultSet(Select(sql + " where `estrutura`.`TEST_CLIENTE_FK` = " + model.getClienteModel().getCodigo() + " ", model.getNomeTela()));
                    break;
            }
            while (model.getResultSet().next()) {
                br.com.documentar.model.EstruturaModel p = new br.com.documentar.model.EstruturaModel();
                p.setCodigo(rs.getInt("TEST_CODIGO_PK"));
                p.getProdutoModel().setCodigo(rs.getInt("TEST_PRODUTO_FKN"));
                p.getProdutoModel().setNome(rs.getString("TPRO_NOME"));
                p.getProdutoModel().setSigla(rs.getString("TPRO_SIGLA"));
                p.getClienteModel().setCodigo(rs.getInt("TEST_CLIENTE_FK"));
                p.getClienteModel().setNomeRazao(rs.getString("TCLI_NOME_RAZAO_SOCIAL"));
                p.setNomeComputador(rs.getString("TEST_NOME_COMPUTADOR"));
                p.setTipoComputador(rs.getString("TEST_TIPO").charAt(0));
                p.setHostIP(rs.getString("TEST_IP"));
                p.setTipoAcessoRemoto(rs.getString("TEST_TIPO_ACESSO_REMOTO").charAt(0));
                p.setUsuarioAcessoRemoto(rs.getString("TEST_USUARIO_ACESSO_REMOTO"));
                p.setSenhaAcessoRemoto(rs.getString("TEST_SENHA_ACESSO_REMOTO"));
                p.setTipoBancoDados(rs.getString("TEST_TIPO_BANCO_DADOS"));
                p.setNomeBancoDados(rs.getString("TEST_NOME_BANCO_DADOS"));
                p.setPortaBancoDados(rs.getString("TEST_PORTA_BANCO_DADOS"));
                model.getLista().add(p);
            }
        } catch (SQLException ex) {
            ex.getStackTrace();
        } finally {
            Desconectar(model.getNomeTela());
        }
        return model.getLista();
    }

    /**
     * Metodo generico para consultar dados no oracle
     *
     * @param model
     * @return
     */
    public List<EstruturaModel> getDadosERP(EstruturaModel model) {
        AbstractDAO teste = new AbstractDAO("Oracle", model.getHostERP(), model.getNomeBancoERP(), model.getPortaERP(), model.getUsuarioERP(), model.getSenhaERP());

        model.setResultSet(null);
        model.getLista().clear();
        String sql = "select host.HOST_NAME, host.VERSION\n"
                + "  from v$instance host "
                + "  where host.INSTANCE_NAME = '" + model.getNomeBancoDados().toLowerCase() + "' ";
        try {
            teste.ConnectDataBase();
            switch (model.getActionScript()) {
                case "porInstance":
                    model.setResultSet(teste.Select(sql, model.getNomeTela()));
                    break;
            }
            while (teste.rs.next()) {
                br.com.documentar.model.EstruturaModel p = new br.com.documentar.model.EstruturaModel();
                p.setVersaoBanco(teste.rs.getString("VERSION"));
                p.setNomeComputador(teste.rs.getString("HOST_NAME"));
                model.getLista().add(p);
            }
        } catch (SQLException ex) {
            ex.getStackTrace();
        } finally {
            teste.Desconectar(model.getNomeTela());
        }
        return model.getLista();
    }

    /**
     * Metodo generico para consultar dados no oracle
     *
     * @param model
     * @return
     */
    public List<EstruturaModel> getDadosFrenteLoja(EstruturaModel model) {
        AbstractDAO teste = new AbstractDAO("Firebird", model.getHostFrenteLoja(), model.getNomeBancoFrenteLojaSRV(), model.getPortaFrenteLoja(), model.getUsuarioFrenteLoja(), model.getSenhaFrenteLoja());

        model.setResultSet(null);
        model.getLista().clear();
        String sql = "SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') AS VERSION \n"
                + " from rdb$database ";
        try {
            teste.ConnectDataBase();
            switch (model.getActionScript()) {
                case "C":
                    model.setResultSet(teste.Select(sql, model.getNomeTela()));
                    break;
            }
            while (teste.rs.next()) {
                br.com.documentar.model.EstruturaModel p = new br.com.documentar.model.EstruturaModel();
                p.setVersaoBanco(teste.rs.getString("VERSION"));
                model.getLista().add(p);
            }
        } catch (SQLException ex) {
            ex.getStackTrace();
        } finally {
            teste.Desconectar(model.getNomeTela());
        }
        return model.getLista();
    }
}
